package psn.kiko.util.encrypt;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.MalformedJwtException;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.SignatureException;
import io.jsonwebtoken.UnsupportedJwtException;
import lombok.Getter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import psn.kiko.config.properties.TokenProperties;

import java.util.Date;

/**
 *token工具类<br>
 * token一种常见的身份验证方式,用于验证用户的身份和权限.<br>
 * 是一串具有一定格式的字符串,包含了一些用户信息和加密算法.<br>
 * 1.生成payload,payload是token的有效负载,通常包含一些用户信息,<br>
 * 如ID,用户名,角色等.可以使用JSON格式来表示payload
 */
@Component
@Getter
public class Tokens{
	@Autowired
	TokenProperties tokenProperties;
	
	/**
	 * 用于生成token
	 * @param userId
	 * @param userName
	 *
	 * @return
	 */
	public String generateFrom(String userId,String userName){
		Date now=new Date();
		Date expiration=new Date(now.getTime()+tokenProperties.getDuration());
		
		return Jwts.builder()
				/*设置payload各个属性*/
				.setSubject(userId)
				.setIssuer(tokenProperties.getIssuer())
				.setIssuedAt(now)
				.setExpiration(expiration)
				.claim("userName",userName)
				/*指定加密算法和密钥*/
				.signWith(SignatureAlgorithm.HS256,tokenProperties.getSecretKey())
				/*生成token字符串*/
				.compact();
	}
	
	/**
	 * 验证token的合法性
	 * @param token
	 *
	 * @return 验证通过-true,验证失败-false
	 */
	public boolean validate(String token){
		try{
			Jwts.parser().setSigningKey(tokenProperties.getSecretKey()).parseClaimsJws(token);
			return true;
		}catch(ExpiredJwtException|UnsupportedJwtException|MalformedJwtException|SignatureException|IllegalArgumentException e){
			return false;
		}
	}
	
	/**
	 * 从Token中获取payload
	 * @param token
	 *
	 * @return
	 */
	public Claims getClaimsFrom(String token){
		return Jwts.parser().setSigningKey(tokenProperties.getSecretKey()).parseClaimsJws(token).getBody();
	}
}
